# 作者: YWH
# 2025年01月02日19时26分11秒
# 981474892@qq.com

my_list = "This is a test string ABC helLo world".split()
print(my_list)


def change_lower(str_name: str):#大写转小写
    return str_name.lower()


# key可以传递一个比较规则的函数,比较规则发生了改变,key就是给它传递一个函数

my_list.sort(key=change_lower)#p排序后sort会改变原列表
print(my_list)

print("-"*95)
student_tuples = [
    ('jane', 'B', 12),
    ('john', 'A', 15),
    ('dave', 'B', 10),
]

# lambda表达式，就是匿名函数，匿名函数好处，提高编写效率，提高阅读速度
print(sorted(student_tuples, key=lambda x: x[2]))#以元组的第三个元素为标准排序，x[0]则是第一个元素


class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

    def __repr__(self):
        """
        相对于__str__来说，更方便，可以返回非字符串类型
        :return:
        """
        return repr((self.name, self.grade, self.age))


student = Student('john', 'A', 15)
student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]
print("-"*95)
print(sorted(student_objects,key=lambda student:student.age))#根据学生年龄来排序



from operator import itemgetter, attrgetter

print("-"*95)
print('使用operator：')
print(sorted(student_tuples, key=itemgetter(0)))#按元组中的第一个元素排序
print(sorted(student_objects,key=attrgetter('age')))#按照关键字“年龄”来排序

print("-"*95)
print('使用operator：多列排序')
print(sorted(student_tuples, key=itemgetter(1,2)))#正数代表升序，前后代表第一列第二列。
print(sorted(student_tuples, key=lambda x: (x[1],-x[2]))) #第一列升序，第二列降序
print(sorted(student_objects, key=attrgetter('grade', 'age'),reverse=True))#降序，先看成绩（如果相等），再看年龄

print("-"*95)
print('查看排序稳定性')
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
print(sorted(data, key=itemgetter(0)))#按照颜色排序，若为稳定，则相同颜色的相对位置不变。

print("-"*95)
my_dict = { 'Li'   : ['M',7],
           'Zhang': ['E',2],
           'Wang' : ['P',3],
           'Du'   : ['C',2],
           'Ma'   : ['C',9],
           'Zhe'  : ['H',7] }
# my_dict=my_dict.items()
# print("-"*95)
# print(f'字典内容：{my_dict}')
print("-"*95)

print(sorted(my_dict.items(),key=lambda x:x[1][1]))#以字典的值的第二列元素为基准排序。x[0]是键

gameresult = [
    { "name":"Bob", "wins":10, "losses":3, "rating":75.00 },
    { "name":"David", "wins":3, "losses":5, "rating":57.00 },
    { "name":"Carol", "wins":4, "losses":5, "rating":57.00 },
    { "name":"Patty", "wins":9, "losses":3, "rating": 71.48 }]
print("-"*95)

print(sorted(gameresult,key=lambda x:x['rating']))#按照rating排序，默认升序
print(sorted(gameresult , key=itemgetter("rating","name")))#先rating后name，相同比后者，默认升序